home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / comm / pccp019.zip / COMSCRPT.C < prev    next >
Text File  |  1992-05-08  |  16KB  |  738 lines

  1. /*    Copyright (C) 1992 Peter Edward Cann, all rights reserved.
  2.  *    MicroSoft QuickC: >qcl term.c graphics.lib
  3.  */
  4.  
  5. #include<stdio.h>
  6. #include<bios.h>
  7. #include<dos.h>
  8. #include<fcntl.h>
  9. #include<signal.h>
  10. #include<process.h>
  11.  
  12. #define DLLSBREG 0
  13. #define DLMSBREG 1
  14. #define INTCTLREG 1
  15. #define INTIDREG 2
  16. #define LCTLREG 3
  17. #define MCTLREG 4
  18. #define STATREG 5
  19. #define MSTATREG 6
  20.  
  21. #define DCDMASK 0x80
  22. #define CTSMASK 0x10
  23. #define TXMTMASK 0x20
  24. #define RXRDYMASK 0x01
  25.  
  26. #define INTACK 0x20
  27.  
  28. #define DB7 0x02
  29. #define DB8 0x03
  30. #define STOP2 0x04
  31. #define PARITYEN 0x08
  32. #define PARITYEVEN 0x10
  33. #define DLAB 0x80
  34.  
  35. #define INTBASE1 0x20
  36. #define INTMASK1 0x21
  37. #define INTBASE2 0xa0
  38. #define INTMASK2 0xa1
  39.  
  40. #define TBUFSIZ 4096
  41.  
  42. #define PROGSIZ 256
  43.  
  44. struct line
  45.     {
  46.     char type;
  47.     union
  48.         {
  49.         unsigned char byte;
  50.         int number;
  51.         struct
  52.             {
  53.             int retries;
  54.             int hits;
  55.             unsigned char label;
  56.             }
  57.             retry;
  58.         struct
  59.             {
  60.             unsigned char label;
  61.             unsigned char string[81];
  62.             }
  63.             l_and_s;
  64.         unsigned char string[81];
  65.         }
  66.         stuff;
  67.     }
  68.     program[PROGSIZ];
  69.  
  70. #define MAXNSCANS 16
  71.  
  72. struct
  73.     {
  74.     unsigned char index;
  75.     unsigned char *str;
  76.     unsigned char hitlabel;
  77.     }
  78.     scans[MAXNSCANS];
  79.  
  80. int nscans;
  81.  
  82. short int labels[256]; /* Not a #define cause we use unsigned char all over */
  83.  
  84. int index, basereg;
  85. char buf[TBUFSIZ];
  86. unsigned char diffintmask, irqnum;
  87. void (interrupt far *oldvect)();
  88.  
  89. void interrupt far inthndl(_es, _ds, _di, _si, _bp, _sp,
  90.               _bx, _dx, _cx, _ax, _ip, _cs, _flags)
  91.     unsigned _es, _ds, _di, _si, _bp, _sp;
  92.     unsigned _bx, _dx, _cx, _ax, _ip, _cs, _flags;
  93.     {
  94.     if(inp(basereg+STATREG)&0x01)
  95.         {
  96.         buf[index++]=inp(basereg)&0xff;
  97.         index=index%TBUFSIZ;
  98.         }
  99.     outp(INTBASE1, INTACK);
  100.     outp(INTBASE2, INTACK);
  101.     }
  102.  
  103. unsigned char newintmask, oldintmask, lctl, dlmsb, dllsb;
  104. unsigned intnum;
  105. unsigned char oldlctl, olddllsb, olddlmsb, oldintctl, oldmctl;
  106.  
  107. setup()
  108.     {
  109.     outp(basereg+LCTLREG, DLAB);
  110.     olddllsb=inp(basereg+DLLSBREG);
  111.     olddlmsb=inp(basereg+DLMSBREG);
  112.     outp(basereg+DLLSBREG, dllsb);
  113.     outp(basereg+DLMSBREG, dlmsb);
  114.     oldlctl=inp(basereg+LCTLREG);
  115.     outp(basereg+LCTLREG, lctl);
  116.     _dos_setvect(intnum, inthndl);
  117.     oldintctl=inp(basereg+INTCTLREG);
  118.     outp(basereg+INTCTLREG, 0x00);
  119.     oldmctl=inp(basereg+MCTLREG);
  120.     outp(basereg+MCTLREG, 0x0b);
  121.     newintmask=diffintmask;
  122.     newintmask&=oldintmask;
  123.     if(intnum==10)
  124.         outp(INTMASK2, newintmask);
  125.     else
  126.         outp(INTMASK1, newintmask);
  127.     outp(INTBASE1, INTACK); /* Clean up leftovers */
  128.     outp(INTBASE2, INTACK);
  129.     outp(basereg+INTCTLREG, 0x01);
  130.     outp(INTBASE1, INTACK); /* What a zoo! */
  131.     outp(INTBASE2, INTACK);
  132.     }
  133.  
  134. cleanup()
  135.     {
  136.     if(intnum==10)
  137.         outp(INTMASK2, oldintmask);
  138.     else
  139.         outp(INTMASK1, oldintmask);
  140.     outp(basereg+LCTLREG, DLAB);
  141.     outp(basereg+DLLSBREG, olddllsb);
  142.     outp(basereg+DLMSBREG, olddlmsb);
  143.     outp(basereg+LCTLREG, oldlctl);
  144.     outp(basereg+INTCTLREG, oldintctl);
  145.     outp(basereg+MCTLREG, oldmctl);
  146.     _dos_setvect(intnum, oldvect);
  147.     }
  148.  
  149. quit()
  150.     {
  151.     cleanup();
  152.     exit(99);
  153.     }
  154.  
  155. sendchar(c)
  156.     unsigned char c;
  157.     {
  158.     while(!((inp(basereg+STATREG)&TXMTMASK)&&(inp(basereg+MSTATREG)&CTSMASK)))
  159.         {
  160.         if(kbhit())
  161.             getch(); /* Give chance for ^C */
  162.         }
  163.     outp(basereg, c);
  164.     return(0);
  165.     }
  166.  
  167. int follow;
  168.  
  169. sleep()
  170.     {
  171.     long tod, tod1, day;
  172.     day=0;
  173.     _bios_timeofday(_TIME_GETCLOCK, &tod);
  174.     while(1)
  175.         {
  176.         if(_bios_timeofday(_TIME_GETCLOCK, &tod1))
  177.             day=20*60*60*24;
  178.         if((tod1+day-tod)>8)
  179.             break;
  180.         }
  181.     }
  182.  
  183. main(argc, argv)
  184.     int argc;
  185.     char **argv;
  186.     {
  187.     FILE *scriptfd;
  188.     char c, fpname[256], str[81], *strptr;
  189.     char comstr[16], speedstr[16], bitsstr[16];
  190.     int i, j, proglen, value[8], flag, progcnt;
  191.     unsigned speed;
  192.     int comnum;
  193.     char databits, parity, stopbits;
  194.     long timestamp;
  195.     index=follow=0;
  196.     lctl=0;
  197.     printf("Copyright (C) 1992 Peter Edward Cann, all rights reserved.\n");
  198.     if(!strcmp(getenv("REMOTE"), "YES"))
  199.         {
  200.         printf("You appear to be logged in remotely, judging by the environment\n");
  201.         printf("variable REMOTE, so it strikes me as somewhat peculiar that you\n");
  202.         printf("want to run COMSCRPT. Are you sure you want to do it? (y or n) --> ");
  203.         if(getchar()!='y') /* Note getchar() and not getch()! */
  204.             {
  205.             printf("I didn't think so!\n");
  206.             exit(99);
  207.             }
  208.         else
  209.             printf("OK, you're the boss!");
  210.         }
  211.     if(argc!=2)
  212.         {
  213.         printf("USAGE: comscrpt <script file basename>\n");
  214.         printf("The environment variable TERMPATH is used for the script file if set.\n");
  215.         exit(1);
  216.         }
  217.     fpname[0]='\0';
  218.     if(getenv("TERMPATH")==NULL)
  219.         sprintf(fpname, "%s.scr", argv[1]);
  220.     else
  221.         sprintf(fpname, "%s\\%s.scr", getenv("TERMPATH"), argv[1]);
  222.     if((scriptfd=fopen(fpname, "r"))==NULL)
  223.         {
  224.         printf("Error opening script file %s.\n", fpname);
  225.         exit(2);
  226.         }
  227.     fgets(str, 80, scriptfd);
  228.     if(sscanf(str, "%s %s %s", comstr, speedstr, bitsstr)!=3)
  229.         {
  230.         printf("Can't read init params.\n");
  231.         exit(10);
  232.         }
  233.     comnum=atoi(comstr)-1;
  234.     newintmask=0;
  235.     switch(comnum)
  236.         {
  237.         case 0:
  238.             irqnum=4;
  239.             diffintmask=0xff&~0x10;
  240.             basereg=0x3f8;
  241.             break;
  242.         case 1:
  243.             irqnum=3;
  244.             diffintmask=0xff&~0x08;
  245.             basereg=0x2f8;
  246.             break;
  247.         case 2:
  248.             irqnum=4;
  249.             diffintmask=0xff&~0x10;
  250.             basereg=0x3e8;
  251.             break;
  252.         case 3:
  253.             irqnum=3;
  254.             diffintmask=0xff&~0x08;
  255.             basereg=0x2e8;
  256.             break;
  257.         case 4:
  258.             irqnum=2;
  259.             diffintmask=0xff&~0x02;
  260.             basereg=0x3e8;
  261.             break;
  262.         case 5:
  263.             irqnum=2;
  264.             diffintmask=0xff&~0x02;
  265.             basereg=0x2e8;
  266.             break;
  267.         case 6:
  268.             irqnum=5;
  269.             diffintmask=0xff&~0x20;
  270.             basereg=0x3e8;
  271.             break;
  272.         case 7:
  273.             irqnum=5;
  274.             diffintmask=0xff&~0x20;
  275.             basereg=0x2e8;
  276.             break;
  277.         default:
  278.             printf("Bad port choice.\n");
  279.             exit(4);
  280.         }
  281.     intnum=irqnum+8;
  282.     speed=atoi(speedstr);
  283.     switch(speed)
  284.         {
  285.         case 300:
  286.             dlmsb=0;
  287.             dllsb=0xc0;
  288.             break;
  289.         case 1200:
  290.             dlmsb=0;
  291.             dllsb=0x60;
  292.             break;
  293.         case 2400:
  294.             dlmsb=0;
  295.             dllsb=0x30;
  296.             break;
  297.         case 9600:
  298.             dlmsb=0;
  299.             dllsb=0x0c;
  300.             break;
  301.         case 19200:
  302.             dlmsb=0;
  303.             dllsb=0x06;
  304.             break;
  305.         case 38400:
  306.             dlmsb=0;
  307.             dllsb=0x03;
  308.             break;
  309.         case 57600:
  310.             dlmsb=0;
  311.             dllsb=0x02;
  312.             break;
  313.         default:
  314.             printf("Bad speed.\n");
  315.             exit(5);
  316.         }
  317.     parity=bitsstr[1];
  318.     switch(parity)
  319.         {
  320.         case 'e':
  321.         case 'E':
  322.             lctl |= PARITYEN | PARITYEVEN;
  323.             break;
  324.         case 'o':
  325.         case 'O':
  326.             lctl|=PARITYEN;
  327.             break;
  328.         case 'n':
  329.         case 'N':
  330.             break;
  331.         default:
  332.             printf("Bad parity.\n");
  333.             exit(7);
  334.         }
  335.     databits=bitsstr[0];
  336.     switch(databits)
  337.         {
  338.         case '7':
  339.             lctl|=DB7;
  340.             break;
  341.         case '8':
  342.             lctl|=DB8;
  343.             break;
  344.         default:
  345.             printf("Bad data bits.\n");
  346.             exit(8);
  347.         }
  348.     stopbits=bitsstr[2];
  349.     switch(stopbits)
  350.         {
  351.         case '1':
  352.             break;
  353.         case '2':
  354.             lctl|=STOP2;
  355.             break;
  356.         default:
  357.             printf("Bad stop bits.\n");
  358.             exit(9);
  359.         }
  360.     for(i=0;i<256;++i)
  361.         labels[i]=-1;
  362.     oldintmask=(intnum==10)?inp(INTMASK2):inp(INTMASK1);
  363.     oldvect=_dos_getvect(intnum);
  364.     signal(SIGINT, quit);
  365.     setup();
  366.     /* Parse */
  367.     printf("Parsing...\n");
  368.     flag=0;
  369.     for(proglen=0;proglen<PROGSIZ;++proglen)
  370.         {
  371.         if(fgets(str, 80, scriptfd)==NULL)
  372.             {
  373.             flag=1;
  374.             proglen++;
  375.             break;
  376.             }
  377.         for(i=0;i<80;++i)
  378.             if(str[i]=='\n')
  379.                 {
  380.                 str[i]='\0';
  381.                 break;
  382.                 }
  383.             else if(str[i]=='\0')
  384.                 break;
  385.         if(!strlen(str))
  386.             proglen--;
  387.         else
  388.             {
  389.             if((str[0]!=';')&&(str[1]!=' '))
  390.                 {
  391.                 printf("Missing first delimiting space at statement %d.\n", proglen);
  392.                 printf("Statement reads:\n%s\n", str);
  393.                 cleanup();
  394.                 exit(11);
  395.                 }
  396.             switch(str[0])
  397.                 {
  398.                 case ':':
  399.                     if(sscanf(str, "%*c %d", &value[0])!=1)
  400.                         {
  401.                         printf("Bad scan of label (:) before statement %d.\n", proglen);
  402.                         cleanup();
  403.                         exit(11);
  404.                         }
  405.                     if((value[0]<0)||(value[0]>255))
  406.                         {
  407.                         printf("Label %d out of range.\n", value[0]);
  408.                         cleanup();
  409.                         exit(11);
  410.                         }
  411.                     if(labels[value[0]]!=-1)
  412.                         {
  413.                         printf("Label %d duplicated at statement %d.\n", value[0], proglen);
  414.                         cleanup();
  415.                         exit(11);
  416.                         }
  417.                     labels[value[0]]=proglen;
  418.                     proglen--;
  419.                     break;
  420.                 case '